package cn.wawi.controller.sys;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @description 系统验证码
 * @author 龚亮
 * @date 2015-05-26 10:11:12
 */
@Controller
public class ValidateCodeController {

	/**
	 * 　　* 生成验证码图片 功能:生成彩色验证码图片
	 */
	@RequestMapping("/code")
	public void getCertPic(HttpServletRequest request,HttpServletResponse response) {
		int width = 60;
		int height = 25;
		try {
			OutputStream os = response.getOutputStream();
			// 验证码图片中可以出现的字符集，可根据需要修改
			char mapTable[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
					'J', 'K', 'N', 'L', 'M', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
					'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8',
					'9' };
			BufferedImage image = new BufferedImage(width, height,
					BufferedImage.TYPE_INT_RGB);
			// 获取图形上下文
			Graphics g = image.getGraphics();
			// 设定背景色
			g.setColor(new Color(0xDCDCDC));
			g.fillRect(0, 0, width, height);
			// 画边框
			g.setColor(Color.black);
			g.drawRect(0, 0, width - 1, height - 1);
			// 取随机产生的认证码
			String strEnsure = "";
			// 4代表4位验证码,如果要生成更多位的认证码,则加大数值
			for (int i = 0; i < 4; ++i) {
				strEnsure += mapTable[(int) (mapTable.length * Math.random())];
			}
			request.getSession().setAttribute("strEnsure", strEnsure);
			// 将认证码显示到图像中,如果要生成更多位的认证码,增加drawString语句
			g.setColor(Color.black);
			g.setFont(new Font("Atlantic Inline", Font.PLAIN, 18));
			String str = strEnsure.substring(0, 1);
			g.drawString(str, 8, 17);
			str = strEnsure.substring(1, 2);
			g.drawString(str, 20, 15);
			str = strEnsure.substring(2, 3);
			g.drawString(str, 35, 18);
			str = strEnsure.substring(3, 4);
			g.drawString(str, 45, 15);
			Random rand = new Random();// 随机产生10个干扰点
			for (int i = 0; i < 10; i++) {
				int x = rand.nextInt(width);
				int y = rand.nextInt(height);
				g.drawOval(x, y, 1, 1);
			}
			g.dispose();// 释放图形上下文
			ImageIO.write(image, "JPEG", os);// 输出图像到页面
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	@RequestMapping("/codes")
	public void getCertPics(HttpServletRequest request,HttpServletResponse response){
		//设置页面不缓存
		response.setHeader("Pragma", "No-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);

		// 在内存中创建图象
		int width = 60, height = 25;
		BufferedImage image = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_RGB);

		// 获取图形上下文
		Graphics g = image.getGraphics();

		//生成随机类
		Random random = new Random();

		// 设定背景色
		g.setColor(getRandColor(200, 250));
		g.fillRect(0, 0, width, height);

		//设定字体
		g.setFont(new Font("Times New Roman", Font.PLAIN, 18));

		//画边框
		//g.setColor(new Color());
		//g.drawRect(0,0,width-1,height-1);

		// 随机产生155条干扰线，使图象中的认证码不易被其它程序探测到
		g.setColor(getRandColor(160, 200));
		for (int i = 0; i < 155; i++) {
			int x = random.nextInt(width);
			int y = random.nextInt(height);
			int xl = random.nextInt(12);
			int yl = random.nextInt(12);
			g.drawLine(x, y, x + xl, y + yl);
		}

		// 取随机产生的认证码(4位数字)
		String sRand = "";
		for (int i = 0; i < 4; i++) {
			String rand = String.valueOf(random.nextInt(10));
			sRand += rand;
			// 将认证码显示到图象中
			g.setColor(new Color(20 + random.nextInt(110), 20 + random
					.nextInt(110), 20 + random.nextInt(110)));// 调用函数出来的颜色相同，可能是因为种子太接近，所以只能直接生成
			g.drawString(rand, 13 * i + 6, 16);
		}

		// 将认证码存入SESSION
		request.getSession().setAttribute("rand", sRand);

		// 图象生效
		g.dispose();
		OutputStream output=null;
		try {
			output = response.getOutputStream();
			// 输出图象到页面
			ImageIO.write(image, "JPEG", response.getOutputStream());
			output.flush();
			output.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public Color getRandColor(int fc, int bc){
		Random random = new Random();
		if (fc > 255)
			fc = 255;
		if (bc > 255)
			bc = 255;
		int r = fc + random.nextInt(bc - fc);
		int g = fc + random.nextInt(bc - fc);
		int b = fc + random.nextInt(bc - fc);
		return new Color(r, g, b);
	}
}
